/**
 * @author Liu Awen
 * @create 2020-05-15 0:09
 */

import java.util.Scanner;

/**
 * 3、二进制转换器
 * - 掌握 `if...else if ... else ` 的用法
 * - 掌握 计算机组成原理 中的 原码、反码、补码
 * - 熟练应用 **循环语句**
 * - 掌握 整数的除法运算 和 模运算
 * - 掌握  `~` 运算符的用法
 * 正数三码合一  负数 符号位 1 原码   反码按位取反（除符号位） 补码 反码 +1
 * // 【计算机组成原理】负数的原码 : 10001011   【 -11 】
 * byte fourth = (byte)0b10001011 ; // 默认将 0b10001011 当做 int 对待
 * System.out.println( fourth );
 *
 * // 【计算机组成原理】负数的反码 : 11110100
 * byte fifth = (byte)0b11110100 ; // 默认将 0b11110100 当做 int 对待
 * System.out.println( fifth ); // -12
 *
 * // 【计算机组成原理】负数的补码 : 11110101
 * byte sixth = (byte)0b11110101 ; // 默认将 0b11110100 当做 int 对待
 * System.out.println( sixth ); // -11
 */
//编写一个程序，将用户输入的单个整数(十进制)转换为其相应的二进制形式。
//- 如果是正整数则直接采用原码作为其二进制形式 ( 正整数的原码、反码、补码都相同 )
//- 如果是负整数则需要根据原码求其反码、再根据反码求其补码
public class Demo3 {
    public static void main(String[] args){

        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个十进制整数：" );
        int a = sc.nextInt();
        if(a > 0){
            String s = "";
            for(int i =0 ;i < 31;i++){
                s = (a % 2) + s;
                a /= 2;
                //八位一字节 占一个
                if(i % 8 == 7)
                    s = "_" + s;
            }
            System.out.println("二进制形式为：0" + s);
        }else if(a == 0){
            System.out.println("二进制形式为：00000000_00000000_00000000_00000000");
        }else{
            String s = "";
            int x = -a;
            for(int i =0 ;i < 31;i++){
                s = (x % 2) + s;
                x /= 2;
                if(i % 8 == 7)
                    s = "_" + s;
            }
            System.out.println("二进制形式原码为：1" + s);
            s = "";
            x = -a;
            for(int i =0 ;i < 31;i++){
                if((x % 2) == 0)
                    s = 1 + s;
                else
                    s = 0 + s;
                x /= 2;
                if(i % 8 == 7)
                    s = "_" + s;
            }
            System.out.println("二进制形式反码为：1" + s);
            s = "";
            x = -a - 1;
            for(int i =0 ;i < 31;i++){
                if((x % 2) == 0)
                    s = 1 + s;
                else
                    s = 0 + s;
                x /= 2;
                if(i % 8 == 7)
                    s = "_" + s;
            }
            System.out.println("二进制形式补码为：1" + s);
        }
        sc.close();

    }
}
